<!DOCTYPE html>
<html lang="zh-CN">


<head><meta name="generator" content="Hexo 3.9.0">
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
  <title>
    操作系统 | Haitao Space
  </title>
  <meta name="description" content="Stay hungry, stay foolish.">
  
  <meta name="keywords" content="
  操作系统
  ">
  
  <meta name="author" content="haitaoW">

  <meta http-equiv="Cache-Control" content="no-transform">
  <meta http-equiv="Cache-Control" content="no-siteapp">
  <meta name="theme-color" content="#1e2327">
  <link rel="apple-touch-icon" href="https://github.githubassets.com/apple-touch-icon.png">
  <link rel="apple-touch-icon" sizes="180x180" href="https://github.githubassets.com/apple-touch-icon-180x180.png">

  <link rel="icon" type="image/x-icon" href="https://assets-cdn.github.com/favicon.ico">
  <link rel="stylesheet" href="/css/main.css">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
  

  

  <script src="//cdnjs.cloudflare.com/ajax/libs/vue/1.0.25-csp/vue.min.js"></script>
  <script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.11.2/moment.min.js"></script>
</head>

<body id="replica-app">

<nav class="navbar-wrapper">
  <div class="navbar">
    <div class="container clearfix">
      <a href="/" class="navbar-logo"><i class="fa fa-github"></i></a>

      <div class="navbar-search float-left desktop-only">
        <div class="navbar-search-form">
          <label for="gsc-i-id1">This website</label>
          <div id="google-search">
            <gcse:search></gcse:search>
          </div>
        </div>
      </div>

      <ul class="navbar-nav float-left">
        
        <li><a href="/archives">Archives</a></li>
        
        
        <li><a href="/categories">Categories</a></li>
        
        
        <li><a href="/tags">Tags</a></li>
        
        
        <li class="desktop-only"><a href="/atom.xml" target="_blank">RSS</a></li>
        
      </ul>

      <ul class="navbar-nav user-nav float-right desktop-only">
        <li class="user-nav-notification">
          <a><span class="user-nav-unread"></span><i class="fa fa-bell"></i></a>
        </li>
        <li>
          <a><i class="fa fa-plus"></i> <i class="fa fa-caret-down"></i></a>
        </li>
        <li class="user-nav-logo">
          <a><img src="https://ws1.sinaimg.cn/large/006VKYWFly1g5b0lv0x0qj30rs0mn4gt.jpg"> <i class="fa fa-caret-down"></i></i></a>
        </li>
      </ul>
    </div>
  </div>
</nav>

<div class="main-container">
  <header class="header-wrapper desktop-only">
  <div class="container header-site-detail">
    <ul class="header-toolbar">
      <li class="clearfix">
        <a href="/archives" class="header-toolbar-left"><i
                  class="fa fa-file-text"></i> Posts </a>
        <a href="/archives"
           class="header-toolbar-right"> 10 </a>
      </li>
      <li>
        <a href="/tags" class="header-toolbar-left"><i
                  class="fa fa-tags"></i> Tags </a>
        <a href="/tags"
           class="header-toolbar-right"> 8 </a>
      </li>
      <li>
        <a href="/categories" class="header-toolbar-left"><i
                  class="fa fa-folder-open"></i> Categories </a>
        <a href="/categories"
           class="header-toolbar-right"> 5 </a>
      </li>
    </ul>
    <h2 class="header-title">
      <i class="fa fa-book text-muted"></i>
      <a href="/">Haitao Space</a>
      
      
    </h2>
  </div>

  <div class="container">
    <div class="header-tab-wrapper clearfix">
      <span class="header-tab header-tab-selected"><i class="fa fa-thumbs-o-up"></i> Like</span>
      <span class="header-tab"><i class="fa fa-share-alt"></i> Share</span>
      <span class="header-tab"><i class="fa fa-comments-o"></i> Discussion</span>
      <span class="header-tab"><i class="fa fa-bookmark-o"></i> Bookmark </span>
      <span class="header-tab"><i class="fa fa-smile-o"></i> Smile <i class="fa fa-caret-down"></i></span>
    </div>
  </div>
</header>


<div class="post-container container">
  <h3>
    <i class="fa fa-user-o"></i>
    haitaoW

    <span class="post-date float-right" title="{{moment(1564761600000).format('MMM DD, YYYY, h:mm:ss A')}}">
      <i class="fa fa-pencil-square-o"></i>
      {{moment(1564761600000).fromNow()}}
    </span>
  </h3>

  <article class="post-content">
    <h1>操作系统</h1>
    <h4 id="1-什么是进程"><a href="#1-什么是进程" class="headerlink" title="1. 什么是进程"></a>1. 什么是进程</h4><p>A：一个程序至少有一个进程，进程是程序运行的一次执行，进程时系统进行资源分配的最小单位，且每个进程都有自己的地址空间。</p>
<p><strong>进程调度算法</strong>： 先来先服务调度算法、短作业优先调度算法、抢占式优先级调度算法、高响应比优先调度算法、时间片轮法调度算法。</p>
<p><strong>进程的三种状态</strong>：运行、阻塞、就绪。</p>
<h5 id="进程间通信方式"><a href="#进程间通信方式" class="headerlink" title="进程间通信方式"></a>进程间通信方式</h5><ol>
<li>管道   无名管道  与FIFO 有名管道</li>
<li>消息队列</li>
<li>信号量：是一个计数器，用于实现进程间的互斥与<strong>同步</strong></li>
<li>共享内存： 与信号量一起使用，是最快的一种进程间通信方式，</li>
</ol>
<p><strong>共享内存</strong>:  是通过把一块内存分别映射到不同的进程空间中实现进程间通信，而共享内存本身不带有任何互斥与同步机制，因此需要用户自己实现互斥与同步，常用的有互斥锁与信号量</p>
<h4 id="2-线程与进程的区别"><a href="#2-线程与进程的区别" class="headerlink" title="2. 线程与进程的区别"></a>2. 线程与进程的区别</h4><ol>
<li><p>线程是进程的一个实体，是进程的一条执行路径，比进程更小的独立运行的基本单位，线程也被成为轻量级进程，一个程序至少有一个线程。</p>
</li>
<li><p>多线程的意义在于一个应用程序中，有多个执行部分可以同时执行，一个进程中所有线程共享该地址空间，但是他们有各自独立的栈（stack）</p>
</li>
<li><p>同一个进程内的线程共享本进程内的地址空间，共享本进程的资源。</p>
</li>
<li><p>一个进程崩溃后，在保护模式下，不会对其他进程产生影响，但是一个线程崩溃整个进程崩溃，所以多进程比多线程健壮。</p>
</li>
<li><p>两者均可以并发执行</p>
</li>
<li><p>线程的划分尺度小于进程，使得多线程程序的并发性高，多个进程共享内存，极大提高程序运行效率。</p>
</li>
</ol>
<p><strong>互斥锁</strong>： </p>
<p><strong>保证进程安全的方法</strong>：</p>
<h4 id="原子操作："><a href="#原子操作：" class="headerlink" title="原子操作："></a>原子操作：</h4><p>原子的本意是不能进一步分割的最小粒子，而原子操作是指：不可中断的一个或一系列操作。 </p>
<h3 id="Q：-大小端的问题"><a href="#Q：-大小端的问题" class="headerlink" title="Q： 大小端的问题"></a>Q： 大小端的问题</h3><p>​    <strong>大端模式（BE big-endian）：</strong>是指数据的低位保存在高位地址中，而数据的高位保存在内存的地地址中</p>
<table>
<thead>
<tr>
<th>地址</th>
<th>数据</th>
</tr>
</thead>
<tbody><tr>
<td>0x0001</td>
<td>12</td>
</tr>
<tr>
<td>0x0002</td>
<td>34</td>
</tr>
</tbody></table>
<p>那么数值为0x1234；</p>
<p>小端模式（LE little-endian）：是指数据的低位保存在内存的低位中，而数据的高位保存在内存的高位中。</p>
<p><a href="https://jocent.me/2017/07/25/big-little-endian.html" target="_blank" rel="noopener">https://jocent.me/2017/07/25/big-little-endian.html</a></p>
<p><a href="https://blog.csdn.net/ce123_zhouwei/article/details/6971544" target="_blank" rel="noopener">https://blog.csdn.net/ce123_zhouwei/article/details/6971544</a></p>
<p><a href="http://www.ruanyifeng.com/blog/2016/11/byte-order.html" target="_blank" rel="noopener">http://www.ruanyifeng.com/blog/2016/11/byte-order.html</a></p>
<h3 id="存储结构"><a href="#存储结构" class="headerlink" title="存储结构"></a>存储结构</h3><ol>
<li><h5 id="存储结构示意图"><a href="#存储结构示意图" class="headerlink" title="存储结构示意图"></a>存储结构示意图</h5></li>
</ol>
<p><img src="https://mmbiz.qpic.cn/mmbiz_png/Ass1lsY6bysOaeD9VG5JiaTNMibYPxicZnaghCuOMjibmmJgymLicFZBkXdwOReYVV1WfJHPhsU23ibEzhSsbdK87aGg/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1" alt="img"></p>
<p>结构图要点解析：</p>
<ol>
<li>金字塔越往上速度越快，价格越高，磁盘是非易失性存储，其他都是易失性存储。</li>
<li>每次上电，只有磁盘有数据然后根据算法挑选数据进行向上传递。</li>
</ol>
<h4 id="2-存储结构分布图"><a href="#2-存储结构分布图" class="headerlink" title="2 存储结构分布图"></a>2 存储结构分布图</h4><p><img src="https://mmbiz.qpic.cn/mmbiz_png/Ass1lsY6bysOaeD9VG5JiaTNMibYPxicZnallU3ffIWwtmLuAkUGnSy4kqrYT5iaBc4IySkpOSmq8YaUaqrduPiaysg/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1" alt="img"></p>
<ol>
<li>CPU中包含了CPUcore 、L1高速缓存 、L2高速缓存、L3高速缓存（SRAM）。</li>
<li>内存部分（DRAM）</li>
<li>磁盘中包含磁盘缓存与磁盘等区域。</li>
</ol>
<h3 id="页、页表、块表与MMU"><a href="#页、页表、块表与MMU" class="headerlink" title="页、页表、块表与MMU"></a>页、页表、块表与MMU</h3><h4 id="1-虚拟存储器"><a href="#1-虚拟存储器" class="headerlink" title="1.虚拟存储器"></a>1.虚拟存储器</h4><p>定义：虚拟存储器是具有请求调入功能和置换功能，能从<strong>逻辑上</strong>对内存容量加以扩充的存储系统。</p>
<p>逻辑上实现的方法：CPU访问虚拟地址，MMU将虚拟地址转化为物理地址，CPU在通过物理地址访问物理内存。</p>
<p>需要解释的：</p>
<ol>
<li>MMU ： CPU的一个硬件模块，专门负责将虚拟地址转换为物理地址。</li>
<li>虚拟地址：APP访问到的地址；</li>
<li>内核实际管理的物理地址。</li>
</ol>
<h4 id="2-页（page）"><a href="#2-页（page）" class="headerlink" title="2. 页（page）"></a>2. 页（page）</h4><p>页：将APP访问的虚拟地址空间切分为若干个大小相等的页，页的大小通常是4K</p>
<p>页框：把物理内存也按照“页”的大小切分为若干大小的相等片，及是页框。</p>
<p>内存管理就是把物理内存划分为一个一个的页框，进程申请内存的时候，内核就以页为单位把进程一个个（虚拟）页装入多个可能不连续的（物理）页框中。</p>
<p><img src="https://mmbiz.qpic.cn/mmbiz_png/Ass1lsY6bysOaeD9VG5JiaTNMibYPxicZna6HGyic9bF1ond8hGXkwcjqMpmXuOoKibMOKjeAzicTZAjnm7ha76Uk6DQ/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1" alt="img"></p>
<p>注意：</p>
<ol>
<li>一个进程的页并不是全部都映射到物理内存的页框中，linux内核只有在万不得已的情况下才会进程分配物理内存。</li>
<li>多个进程的页可以映射到共同的物理内存页框中，这些共享的页框一般是动态库。</li>
</ol>
<h4 id="3-页表"><a href="#3-页表" class="headerlink" title="3. 页表"></a>3. 页表</h4><p>页表记录了“页”与“页框”的对应关系。</p>
<p><em><img src="https://mmbiz.qpic.cn/mmbiz_png/Ass1lsY6bysOaeD9VG5JiaTNMibYPxicZnaRD56ibPrRBMj6iaW5F8sAZSHRZ8K6U0CaH0eZuRROBIFU08iaTcLbvWZw/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1" alt="img"></em></p>
<ol>
<li>页表为每一个进程维护一份页表，一对一；</li>
<li>页表记录了进程与内存也框之间的对应关系。</li>
<li>进程的页不管有没有使用都会记录在页表中即为（1048575），但对于物理内存来说只有迫不得已才会分配给进程。</li>
</ol>
<h4 id="4-多级页表"><a href="#4-多级页表" class="headerlink" title="4. 多级页表"></a>4. 多级页表</h4><p>虚拟页数量=4G/4k=1M（1048576）</p>
<p>多级页表是对一级页表需要的4M的连续内存进行再次分页，在使用另一个页表保存分页记录</p>
<p>内核只需要记录最上一层的页表，通过多次页表转换，去的真正的物理页框号。</p>
<h4 id="5-块表"><a href="#5-块表" class="headerlink" title="5. 块表"></a>5. 块表</h4><p>页表存在于内存中，CPU每次获取数据都需要2次访问内存：</p>
<ol>
<li>第一次访问内存的页表，获取物理地址；</li>
<li>第二次根据物理地址获取真实数据。</li>
</ol>
<p>为了提高访问表的速度，于是有了块表（TLB，Translation lookside buffer）是单独的一组存储器，也是高速缓存，用于记录页表中正咋频繁使用的页表。</p>
<p><em>由于程序和数据的访问往往具有局限性（局部性原理）因此据统计块表的命中率达到90%以上。*</em>块表是为了从概率命中的角度加速虚拟地址到物理地址的转换，设计一组告诉存储硬件模块***</p>
<h4 id="6-MMU-Memory-Management-Uint"><a href="#6-MMU-Memory-Management-Uint" class="headerlink" title="6 MMU(Memory Management Uint)"></a>6 MMU(Memory Management Uint)</h4><p>CPU需要访问虚拟地址，于是把虚拟地址发送给MMU，由MMU内的硬件电路实现访问块表、页表、最终得到物理地址。</p>
<p>//TODO:加图：</p>
<h3 id="CPU-寻页的过程"><a href="#CPU-寻页的过程" class="headerlink" title="CPU 寻页的过程"></a>CPU 寻页的过程</h3><p>CPU获取数据地址主要有两步骤：</p>
<p>a.  通过虚拟地址获取物理地址</p>
<p>b . 根据物理地址获取数据。</p>
<h4 id="1-获取物理地址步骤"><a href="#1-获取物理地址步骤" class="headerlink" title="1. 获取物理地址步骤"></a>1. 获取物理地址步骤</h4><p><img src="https://mmbiz.qpic.cn/mmbiz_png/Ass1lsY6bysOaeD9VG5JiaTNMibYPxicZnaBdia2Vt94nvPcnj4aYqWRrLibeKQONayr9azNLWEeiabiay7ibIF3ooxibBw/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1" alt="img"></p>
<p>a. CPU向MMU发送虚拟地址；</p>
<p>b. MMU查询块表TLB</p>
<p>c. 从高速缓存中，查询页表</p>
<p>d. 从内存中查询页表</p>
<p>e. 把查询的页表项纪录到高速缓存</p>
<p>f. MMU 从高速缓存中获取也表项</p>
<p>g. 进入却页中断处理函数</p>
<p>h. 为虚拟页分配物理页框</p>
<h4 id="2-根据物理地址获取数据"><a href="#2-根据物理地址获取数据" class="headerlink" title="2.根据物理地址获取数据"></a>2.根据物理地址获取数据</h4><p><img src="http://mmbiz.qpic.cn/mmbiz_png/Ass1lsY6bysOaeD9VG5JiaTNMibYPxicZnalicSCKzbCN8E0yvuWs2hYHKzFdKonrc7XDfl79cyzl65Pa4Se7Kx3bw/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1&retryload=0" alt="img"></p>
<p>参考链接：</p>
<ol>
<li><a href="https://www.cnblogs.com/alantu2018/p/9002309.html" target="_blank" rel="noopener">https://www.cnblogs.com/alantu2018/p/9002309.html</a></li>
<li><a href="https://zhuanlan.zhihu.com/p/73696670" target="_blank" rel="noopener">https://zhuanlan.zhihu.com/p/73696670</a></li>
<li><a href="http://airtrack.me/posts/2015/04/27/操作系统实现（二）：分页和物理内存管理/" target="_blank" rel="noopener">http://airtrack.me/posts/2015/04/27/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E7%8E%B0%EF%BC%88%E4%BA%8C%EF%BC%89%EF%BC%9A%E5%88%86%E9%A1%B5%E5%92%8C%E7%89%A9%E7%90%86%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/</a></li>
</ol>

  </article>
</div>


    




</div>

<div class="footer-wrapper container">
  <footer class="footer clearfix">
    <div class="clearfix">
    <a href="https://haitao926.github.io" class="footer-logo">
      <i class="fa fa-github"></i>
    </a>
    <ul class="footer-social-link">
      <li>© 2019 haitaoW</li>
      <li><a href="https://haitao926.github.io">Home</a></li>
      
      <li><a href="https://github.com/haitao926">Github</a></li>
      
    </ul>
    <div class="footer-theme-info">
      Theme <a href="//github.com/sabrinaluo/hexo-theme-replica">Replica</a>
      by <a href="//github.com/sabrinaluo">Hiitea</a> ❤ Powered by Hexo
    </div>
    </div>
    
  </footer>
</div>




<script src="/js/main.js"></script>

</body>
</html>
